package com.school.sports.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import javax.validation.constraints.Size;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;

/**
 * 报名表实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("enrollment")
public class Enrollment {
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空")
    private Long userId;

    /**
     * 项目ID
     */
    @NotNull(message = "项目ID不能为空")
    private Long projectId;

    /**
     * 状态：待审核、已通过、已驳回、已取消
     */
    private String status;

    /**
     * 驳回原因
     */
    @Size(max = 200, message = "长度不能超过200个字符")
    private String rejectReason;

    /**
     * 健康声明
     */
    private String healthStatement;

    /**
     * 创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;

    /**
     * 用户对象（关联查询时使用）
     */
    @TableField(exist = false)
    private User user;

    /**
     * 项目对象（关联查询时使用）
     */
    @TableField(exist = false)
    private Project project;

    /**
     * 报名状态枚举
     */
    public enum EnrollmentStatus {
        PENDING("待审核"),
        APPROVED("已通过"),
        REJECTED("已驳回"),
        CANCELLED("已取消");

        private final String displayName;

        EnrollmentStatus(String displayName) {
            this.displayName = displayName;
        }

        public String getDisplayName() {
            return displayName;
        }

        /**
         * 根据显示名称获取枚举值
         */
        public static EnrollmentStatus fromDisplayName(String displayName) {
            for (EnrollmentStatus status : EnrollmentStatus.values()) {
                if (status.getDisplayName().equals(displayName)) {
                    return status;
                }
            }
            return null;
        }
    }

    /**
     * 设置报名状态
     */
    public void setStatus(String status) {
        this.status = status;
    }

    /**
     * 获取报名状态显示名称
     */
    public String getStatusDisplayName() {
        EnrollmentStatus statusEnum = EnrollmentStatus.fromDisplayName(this.status);
        return statusEnum != null ? statusEnum.getDisplayName() : this.status;
    }

    /**
     * 检查是否可以取消报名
     */
    public boolean canCancel() {
        return "待审核".equals(this.status) || "已通过".equals(this.status);
    }

    /**
     * 检查是否可以审核
     */
    public boolean canAudit() {
        return "待审核".equals(this.status);
    }

    /**
     * 检查是否已通过审核
     */
    public boolean isApproved() {
        return "已通过".equals(this.status);
    }

    /**
     * 检查是否被驳回
     */
    public boolean isRejected() {
        return "已驳回".equals(this.status);
    }

    /**
     * 检查是否已取消
     */
    public boolean isCancelled() {
        return "已取消".equals(this.status);
    }
}